home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #49 (Oct 89) / C INIT π / example.c < prev    next >
C/C++ Source or Header  |  1989-06-25  |  3KB  |  185 lines

  1. #include <SetUpA4.h>
  2.  
  3. #define nil 0l
  4.  
  5. #define ChangedResourceTrap 0xA9AA
  6. #define AddResourceTrap 0xA9AB
  7.  
  8. Handle queryDITL;            /* DITL for unknown dialog */
  9. Handle resourceTypes;        /* handle of all resource types to watch */
  10. long oldChangedResource;    /* address of original ChangedResource */
  11. long oldAddResource;        /* address of original AddResource */
  12. Str255 trash;                /* needed due to Apple bug ? */
  13.  
  14. pascal void NewChangedResource(Handle h);
  15. pascal void NewAddResource(Handle h, ResType rType, int id, Str255 name);
  16. Boolean userDialog();
  17. Boolean inList(ResType type, Handle list);
  18. Str255 *findFileName(int refNum);
  19. void main(void);
  20.  
  21. pascal void NewChangedResource(h)
  22. Handle h;
  23. {
  24.     int id;
  25.     ResType type;
  26.     Str255 resName, num;
  27.     Boolean ok;
  28.  
  29.     SetUpA4();
  30.  
  31.     ok = true;
  32.     GetResInfo(h, &id, &type, &resName);
  33.  
  34.     if (inList(type, resourceTypes) )
  35.         ok = userDialog("\pAttempt to Change Resource",
  36.             type, id, &resName, HomeResFile(h) );
  37.  
  38.     if (ok)
  39.         CallPascal(h, oldChangedResource);
  40.     else
  41.         ResErr = resAttrErr;
  42.  
  43.     RestoreA4();
  44. }
  45.  
  46. pascal void NewAddResource(h, rType, id, name)
  47. Handle h;
  48. ResType rType;
  49. int id;
  50. Str255 name;
  51. {
  52.     Boolean ok;
  53.  
  54.     SetUpA4();
  55.  
  56.     ok = true;
  57.  
  58.     if (inList(rType, resourceTypes) )
  59.         ok = userDialog("\pAttempt to Add Resource",
  60.             rType, id, name, CurResFile() );
  61.  
  62.     if (ok)
  63.         CallPascal(h, rType, id, name, oldAddResource);
  64.     else
  65.         ResErr = addResFailed;
  66.  
  67.     RestoreA4();
  68. }
  69.  
  70. Boolean userDialog(message, type, id, resName, file)
  71. Str255 *message;
  72. ResType type;
  73. int id;
  74. Str255 *resName;
  75. int file;
  76. {
  77.     GrafPtr oldPort;
  78.     Handle tempH;
  79.     DialogPtr d;
  80.     int i;
  81.     Rect r;
  82.     Str255 num;
  83.  
  84.     GetPort(&oldPort);
  85.  
  86.     tempH = queryDITL;
  87.     HandToHand(&tempH);
  88.     SetRect(&r, 90, 68, 444, 226);
  89.     d = NewDialog(nil, &r, nil, true, 1, -1, false, nil, tempH);
  90.  
  91.     SetPort(d);
  92.     MoveTo(20,20);
  93.     DrawString(message);
  94.     MoveTo(20,40);
  95.     DrawString("\pResource Type: ");
  96.     DrawText(&type, 0, 4);
  97.     MoveTo(20,60);
  98.     DrawString("\pResource ID: ");
  99.     NumToString((long)id, num);
  100.     DrawString(num);
  101.     MoveTo(20,80);
  102.     DrawString("\pResource Name: ");
  103.     DrawString(resName);
  104.     MoveTo(20,100);
  105.     DrawString("\pFile Name: ");
  106.     DrawString( findFileName( file ) );
  107.  
  108.     do {
  109.         ModalDialog(nil, &i);
  110.         } while ( i != 1 && i !=2 );
  111.  
  112.     DisposDialog(d);
  113.  
  114.     SetPort(oldPort);
  115.  
  116.     return( i == 1);
  117. }
  118.  
  119. Boolean inList(type, list)
  120. ResType type;
  121. Handle list;
  122. {
  123.     int len;
  124.     ResType *resPtr;
  125.  
  126.     len = GetHandleSize(list) >> 2;
  127.     resPtr = (ResType *)*list;
  128.     while ( len-- )
  129.         if (*resPtr++ == type)
  130.             return(true);
  131.     return(false);
  132. }
  133.  
  134. Str255 *findFileName(refNum)
  135. int refNum;
  136. {
  137.     FCBPBRec p;
  138.  
  139.     p.ioCompletion = 0;
  140.     p.ioRefNum = refNum;
  141.     p.ioFCBIndx = 0;
  142.     p.ioVRefNum = 0;
  143.     p.ioNamePtr = (StringPtr)trash;
  144.     PBGetFCBInfo(&p, false);
  145.  
  146.     return((Str255 *)p.ioNamePtr);
  147. }
  148.  
  149. /*    This block is called once. It saves the pointer
  150.     to this code resource, and installs the patch. */
  151.  
  152. void main()
  153. {
  154.     Handle myHandle;
  155.     Ptr myPtr;
  156.     SysEnvRec world;
  157.     Str255 *namePtr;
  158.  
  159.     asm {
  160.         move.l    A0, myPtr
  161.         }
  162.  
  163.     RememberA0();
  164.     SetUpA4();
  165.  
  166.     if(!Button()) {
  167.         myHandle = RecoverHandle(myPtr);
  168.         DetachResource(myHandle);
  169.  
  170.         resourceTypes = GetResource('ResT', 256);
  171.         DetachResource(resourceTypes);
  172.  
  173.         queryDITL = GetResource('DITL', 256);
  174.         DetachResource(queryDITL);
  175.  
  176.         oldChangedResource = NGetTrapAddress(ChangedResourceTrap,ToolTrap);
  177.         NSetTrapAddress(NewChangedResource,ChangedResourceTrap,ToolTrap);
  178.  
  179.         oldAddResource = NGetTrapAddress(AddResourceTrap,ToolTrap);
  180.         NSetTrapAddress(NewAddResource,AddResourceTrap,ToolTrap);
  181.         }
  182.  
  183.     RestoreA4();
  184. }
  185.